Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / app / src / main / java / com / geeksville / mesh / service / MeshServiceStarter.kt

Displaying Raw • Download

app/src/main/java/com/geeksville/mesh/service/MeshServiceStarter.kt ui_message_list (be3f882f) Text, 3.45 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787com.geeksville.mesh.service

Tff7b72import T7ee787android.app.ForegroundServiceStartNotAllowedException
Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787android.os.Build
Tff7b72import T7ee787androidx.work.BackoffPolicy
Tff7b72import T7ee787androidx.work.OneTimeWorkRequestBuilder
Tff7b72import T7ee787androidx.work.WorkManager
Tff7b72import T7ee787androidx.work.Worker
Tff7b72import T7ee787androidx.work.WorkerParameters
Tff7b72import T7ee787com.geeksville.mesh.BuildConfig
Tff7b72import T7ee787java.util.concurrent.TimeUnit

T8b949e/** Helper that calls MeshService.startService() */
Tff7b72class T56d364ServiceStarterTb4b4b4(Te6edf3appContextTb4b4b4: Te6edf3ContextTb4b4b4, Te6edf3workerParamsTb4b4b4: Te6edf3WorkerParametersTb4b4b4) Tb4b4b4: Te6edf3WorkerTb4b4b4(Te6edf3appContextTb4b4b4, Te6edf3workerParamsTb4b4b4) Tb4b4b4{

Tff7b72override Tff7b72fun Td2a8ffdoWorkTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3Result Tff7b72= Tff7b72try Tb4b4b4{
Te6edf3MeshServiceTb4b4b4.Te6edf3startServiceTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3applicationContextTb4b4b4)

T8b949e// Indicate whether the task finished successfully with the Result
Te6edf3ResultTb4b4b4.Te6edf3successTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3MeshServiceTb4b4b4.Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6fffailure starting service, will retryTa5d6ff"Tb4b4b4, Te6edf3exTb4b4b4)
Te6edf3ResultTb4b4b4.Te6edf3retryTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Just after boot the android OS is super busy, so if we call startForegroundService then, our thread might be stalled
* long enough to expose this Google/Samsung bug: https://issuetracker.google.com/issues/76112072#comment56
*/
Tff7b72fun Te6edf3MeshServiceTb4b4b4.Td2a8ffCompanionTb4b4b4.Te6edf3startServiceLaterTb4b4b4(Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4) Tb4b4b4{
T8b949e// No point in even starting the service if the user doesn't have a device bonded
Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffReceived boot complete announcement, starting mesh service in two minutesTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3delayRequest Tff7b72=
Te6edf3OneTimeWorkRequestBuilderTff7b72<Te6edf3ServiceStarterTff7b72>Tb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setInitialDelayTb4b4b4(T79c0ff2Tb4b4b4, Te6edf3TimeUnitTb4b4b4.Te6edf3MINUTESTb4b4b4)
Tb4b4b4.Te6edf3setBackoffCriteriaTb4b4b4(Te6edf3BackoffPolicyTb4b4b4.Te6edf3EXPONENTIALTb4b4b4, T79c0ff2Tb4b4b4, Te6edf3TimeUnitTb4b4b4.Te6edf3MINUTESTb4b4b4)
Tb4b4b4.Te6edf3addTagTb4b4b4(Ta5d6ff"Ta5d6ffstartLaterTa5d6ff"Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)

Te6edf3WorkManagerTb4b4b4.Te6edf3getInstanceTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3enqueueTb4b4b4(Te6edf3delayRequestTb4b4b4)
Tb4b4b4}

T8b949e// / Helper function to start running our service
Tff7b72fun Te6edf3MeshServiceTb4b4b4.Td2a8ffCompanionTb4b4b4.Te6edf3startServiceTb4b4b4(Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4) Tb4b4b4{
T8b949e// Bind to our service using the same mechanism an external client would use (for testing coverage)
T8b949e// The following would work for us, but not external users:
T8b949e// val intent = Intent(this, MeshService::class.java)
T8b949e// intent.action = IMeshService::class.java.name

T8b949e// Before binding we want to explicitly create - so the service stays alive forever (so it can keep
T8b949e// listening for the bluetooth packets arriving from the radio. And when they arrive forward them
T8b949e// to Signal or whatever.
Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffTrying to start service debug=Tffd700${Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72val Te6edf3intent Tff7b72= Te6edf3createIntentTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3STb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3contextTb4b4b4.Te6edf3startForegroundServiceTb4b4b4(Te6edf3intentTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3ForegroundServiceStartNotAllowedExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffUnable to start service: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3contextTb4b4b4.Te6edf3startForegroundServiceTb4b4b4(Te6edf3intentTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.08s